/**
 * @Copyright:Copyright (c) 1992 - 2015
 * @Company: TengTong
 */
package com.tengtong.duang.commons.convert.support;

import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import com.tengtong.duang.commons.collections.MapUtils;
import com.tengtong.duang.commons.convert.ConditionalConverter;
import com.tengtong.duang.commons.convert.ConversionException;
import com.tengtong.duang.commons.utils.ReflectUtils;

/**
 * 将 collection 的内容转到一个 map， collection 中的元素作为 map 的 key，而 map 的 value 则为空值（不是null，是 string 的空串）
 *
 * @author Jai
 * @since: v1.0
 */
public class CollectionToMapConverter implements ConditionalConverter{

	/**
	 * 如果目标是一个接口，例如 Map 。则内部创建和返回一个 LinkedHashMap。。保证到 collection 的元素顺序一至。
	 *  
	 * 
	 * @see com.tengtong.duang.commons.convert.ConditionalConverter#convert(java.lang.Object, java.lang.Class)
	 */
	@Override
	public Object convert(Object source, Class<?> targetClass) {
		if(source != null && targetClass != null){
			try {
				Map<Object, String> results = null;
				
				if(targetClass.equals(Map.class)){
					results = MapUtils.newLinkedHashMap();
				}else if(targetClass.equals(ConcurrentMap.class)){
					results = new ConcurrentHashMap();
				}else{
					results = (Map<Object, String>)targetClass.newInstance();
				}
				
				Collection datas = (Collection)source;
				
				for(Object o: datas){
					results.put(o, "");
				}
				
				return results;
			}
			catch (Exception e) {
				throw new ConversionException(source.getClass(), targetClass, source, e);
			}
		}
		return null;
	}

	/* (non-Javadoc)
	 * @see com.tengtong.duang.commons.convert.ConditionalConverter#matches(java.lang.Class, java.lang.Class)
	 */
	@Override
	public boolean matches(Class<?> sourceType, Class<?> targetType) {
		return ReflectUtils.isInheritance(sourceType, Collection.class) && 
				ReflectUtils.isInheritance(targetType, Map.class);
	}

}
